const yargs = require('yargs/yargs');
const dedent = require('dedent');
const {hideBin} = require('yargs/helpers');


//region .argv() 显示帮助信息 与 --help
/*console.log(hideBin(process.argv));
const arg = hideBin(process.argv);

yargs(arg)
  .argv() //加了这个会显示出帮助信息*/

//argv() 要放在最后

// --help 默认是支持的
//Pass --help to see all available commands and options.
//
// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js --help
//   [ '--help' ]
// Options:
//   --help     Show help                                                 [boolean]
// --version  Show version number                                       [boolean]

//endregion


//region .strict() 不支持的命令会给出提示信息
/*console.log(hideBin(process.argv));
const arg = hideBin(process.argv);

yargs(arg)
  .strict() // 不支持的命令会给出提示信息
  .argv() */

// --help 默认是支持的
//
// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js --help
//   [ '--help' ]
// Options:
//   --help     Show help                                                 [boolean]
// --version  Show version number                                       [boolean]
// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js --hel
//   [ '--hel' ]
// Options:
//   --help     Show help                                                 [boolean]
// --version  Show version number                                       [boolean]
//
// Unknown argument: hel
// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js --xxx
//   [ '--xxx' ]
// Options:
//   --help     Show help                                                 [boolean]
// --version  Show version number                                       [boolean]
//
// Unknown argument: xxx
// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js -h
//   [ '-h' ]
// Options:
//   --help     Show help                                                 [boolean]
// --version  Show version number                                       [boolean]
//
// Unknown argument: h


//endregion


//region .usage() 、 .demandCommand() 、 .alias()、 .wrap()、 .epilogue()
// console.log(hideBin(process.argv));
// const arg = hideBin(process.argv);
//
// const cli = yargs(arg);
//
// cli
//   .strict() // 不支持的命令会给出提示信息
//
//   .usage('Usage: usg-test [command] <options>')
//
//   .demandCommand(1, 'A command is required. Pass --help to see all available commands and options.')
// // PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js
// //   []
// // Usage: usg-test [command] <options>
// //
// // Options:
// // --help     Show help                                                 [boolean]
// // --version  Show version number                                       [boolean]
// //
// // A command is required. Pass --help to see all available commands and options.
//
// // 注意alias定义的顺序也是展示的顺序
//   .alias("h","help")
//   .alias("v","version")
//
//   //.wrap(100) // 命令行每行显示的最大字符数
//   //怎么占满整个命令行终端窗口呢？
//   .wrap(cli.terminalWidth())
//
// // epilogue
// // 美: [ˈepɪˌlɑɡ]英: [ˈepɪlɒɡ]
// // n.	尾声；跋
// // 网络	后记；终曲；收场白
//   .epilogue(dedent`
//     Your own footer description
//   `)
// // dedent会把你的字符串中的缩进去掉 （顶格显示）
// // dedent `` ---> es6 标签模板的写法，和你 dedent(``) 效果一样 //https://www.bookstack.cn/read/es6-3rd/spilt.7.docs-string.md
// //
// // PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js -h
// //   [ '-h' ]
// // Usage: usg-test [command] <options>
// //
// // Options:
// // -h, --help     Show help                                                                                                                                                           [boolean]
// // -v, --version  Show version number                                                                                                                                                 [boolean]
// //
// // Your own footer description
//
//   .argv()


//endregion

//脚手架里别名不能重复

//region .options()、.option()、.group()
// console.log(hideBin(process.argv));
// const arg = hideBin(process.argv);
//
// const cli = yargs(arg);
//
// cli
//   .strict() // 不支持的命令会给出提示信息
//   .usage('Usage: usg-test [command] <options>')
//   .demandCommand(1, 'A command is required. Pass --help to see all available commands and options.')
//   .alias("h","help")
//   .alias("v","version")
//   .wrap(cli.terminalWidth())
//   .epilogue(dedent`
//     Your own footer description
//   `)
//
//   //全局选项，所有command都可以访问到
//   .options({
//     debug: {
//       type: 'boolean',
//       describe: 'Bootstrap debug mode',
//       alias: 'd'
//     }
//   })
// // PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js -h
// //   [ '-h' ]
// // Usage: usg-test [command] <options>
// //
// // Options:
// // -d, --debug    Bootstrap debug mode                                                                                                                                                [boolean]
// // -h, --help     Show help                                                                                                                                                           [boolean]
// // -v, --version  Show version number                                                                                                                                                 [boolean]
// //
// // Your own footer description
//   //↓ 和 ↑ 一样，只是是单个定义
//   .option('foo', {
//     type: 'string',
//     hidden: true // 带上hidden后，控制台 --help 不会显示该选项，一般是给内部使用的
//   })
//
//   .group(['debug'],'Dev Options:') // 把debug选项放到Dev Options:组里面
// // PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js -h
// //   [ '-h' ]
// // Usage: usg-test [command] <options>
// //
// // Dev Options:
// //   -d, --debug  Bootstrap debug mode                                                                                                                                                  [boolean]
// //
// // Options:
// //   -h, --help     Show help                                                                                                                                                           [boolean]
// // -v, --version  Show version number                                                                                                                                                 [boolean]
// //
// // Your own footer description
//
//   .argv()


//endregion


//region .command()
console.log(hideBin(process.argv));
const arg = hideBin(process.argv);

const cli = yargs(arg);

cli
  .strict() // 不支持的命令会给出提示信息
  .usage('Usage: usg-test [command] <options>')
  .demandCommand(1, 'A command is required. Pass --help to see all available commands and options.')
  .alias("h","help")
  .alias("v","version")
  .wrap(cli.terminalWidth())
  .epilogue(dedent`
    Your own footer description
  `)
  .options({
    debug: {
      type: 'boolean',
      describe: 'Bootstrap debug mode',
      alias: 'd'
    }
  })
  .option('foo', {
    type: 'string',
    hidden: true // 带上hidden后，控制台 --help 不会显示该选项，一般是给内部使用的
  })
  .group(['debug'],'Dev Options:')

  //command两种定义方式
  //一种就是我们↓这样的，另外一种是接受一个对象 --- { command, aliases, describe, builder, handler }
  .command(
    // 1. command的名字 和 option
    'serve [port]',
    // 2. 补充的描述信息
    'start the server',
    // 3. builder函数: 在运行具体的command之前，会先执行builder函数
    (yargs) => {
      //定义一些只有在本command中才能使用的选项
      yargs
        //'serve [port]'中的port
        .positional('port', {
          describe: 'port to bind on',
          default: 5000
        })
    },
    // 4. handler: 命令具体执行的逻辑
    (argv) => {
      console.log(`serve [port] 命令运行 --- --- ---, port为${argv.port}, argv为:${JSON.stringify(argv)}`)
    }
  )
// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js serve 111
//   [ 'serve', '111' ]
// serve [port] 命令运行 --- --- ---, port为111, argv为:{"_":["serve"],"port":111,"$0":"02.yargs.js"}

// PS C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\14.process&child_process\01.argv> node 02.yargs.js -h
//   [ '-h' ]
// Usage: usg-test [command] <options>
//
// Commands:
// 02.yargs.js serve [port]  start the server
//
// Dev Options:
//   -d, --debug  Bootstrap debug mode                                                                                                                                              [boolean]
//
// Options:
//   -h, --help     Show help                                                                                                                                                       [boolean]
// -v, --version  Show version number                                                                                                                                             [boolean]
//
// Your own footer description

  // 如果用户输入了一个不存在的命令，会给出提示信息 (给出最近似的命令,即模糊搜索)
  .recommendCommands()
// Options:
//   -h, --help     Show help                                                                                                                                                       [boolean]  -v, --version  Show version number                                                                                                                                             [boolean]
//
// Your own footer description
//
// Did you mean serve?

  //命令失败时会执行的钩子
  //可以在这里定制输出自己的错误信息
//   .fail((err, msg) => {
//     //直接在这里console输出就是
//
//     console.log('err:',err);
//     console.log('msg:',msg);
// // err: Did you mean serve?
// // msg: undefined
// // err: Unknown argument: serv
// // msg: undefined
//   })

  .argv

//endregion


// 相关项目
// C:\Users\fancier\code\js_workplace\tutorial\node\node_tutorial\docs\12.http\anywhere\bin\www.js
